Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

funceval και bad design

Îåêßíçóå áðü ôï ìÝëïò Markos. Τελευταία δημοσίευση από το μέλος Markos στις 14-08-2009, 18:33. Υπάρχουν 0 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  14-08-2009, 18:33 53069

    funceval και bad design

    Ύστερα από δύο και πλέον εβδομάδες προγραμματιστικού οίστρου έφτασε προχτές η ώρα να ενώσω όλα τα κομμάτια του κώδικα και να τα δοκιμάσω σε πραγματικά δεδομένα. Όλος αυτός ο κόπος έγινε για τη δημιουργία ενός και μόνου report! Είχα βαρεθεί να γράφω linq queries και να φτιάχνω κλάσεις για να ομαδοποιήσω τα στατιστικά αποτελέσματα που επέστρεφαν οι υπολογισμοί. Οι μεταβλητές ήταν στην συντριπτική τους πλειοψηφία double. Το θέμα ήταν ότι μπήκα στον κόπο να ομαδοποιήσω μόνο εκείνες τις μεταβλητές που υπήρχε λογική βάση να ομαδοποιηθούν και προέκυπταν από κοινό result set. Οι υπόλοιπες, παρέμειναν "ορφανές". Πέστε το βαρεμάρα, πέστε το βλακεία, γι' αυτές δε δημιούργησα κλάσεις. Το αποτέλεσμα αυτής της πρακτικής ήταν η δημιουργία τελικών μεθόδων "τεράτων" που συγκέντρωναν όλα τα δεδομένα. Σαν arguments έπαιρναν τις κλάσεις, καθώς και όλες τις "ορφανές" μεταβλητές μία - μία. Το copy - paste συνέβαλε τα μέγιστα ώστε να διαδοθεί αυτή η βλακεία σε πολλά σημεία στον κώδικα.

    Μόλις τελείωσα, προχτές δηλαδή, ενώνω όλα κομμάτια μεταξύ τους και πάω να δημιουργήσω το πρώτο report. Ήμουν σίγουρος ότι όλα θα λειτουργήσουν άψογα, μιας και όλα τα queries είχαν ελεγχθεί ενδελεχώς, προτού γράψω τις τελικές μεθόδους. Αμ δε! Μόλις έτρεξα τον κώδικα τρώω ένα ωραιότατο exception. Βάζω breakpoints για να δω τι επέστρεφαν οι μέθοδοι και σε ένα από αυτά διαβάζω το εξής μήνυμα με το ακόλουθο αναπάντεχο περιεχόμενο:

    IrregularReturns = Cannot evaluate expression because a thread is stopped at a point where garbage collection is impossible, possibly because the code is optimized.

    Το μήνυμα είναι απόλυτα λογικό αν γνωρίζεις τι συμβαίνει στο παρασκήνιο, αλλά αν δεν ξέρεις σε ξαφνιάζει. Πως ένας optimized κώδικας δημιουργεί προβλήματα; Αρχίζω το ψάξιμο στο internet και πέφτω σε μερικά fora που κι άλλοι δυστυχείς developers είχαν έλθει σε επαφή με το ίδιο σφάλμα. Οι συζητήσεις σε πολλά σημεία έπαιρναν περίεργη τροπή, καθώς μερικοί πρότειναν κάποια "μαντζούνια" σαν λύση. Η πραγματική αιτία, όμως, δεν άργησε να φανερωθεί και ακούει στο όνομα funceval (ναι, ακολουθήστε το link). Επίσης, διαβάστε και το άρθρο: Func-eval is evil.

    Οι ανυπόμονοι πηγαίνετε κατευθείαν εδώ όπου ο συγγραφέας αναπαράγει το "σφάλμα" και συστήνει να ΜΗΝ περνάτε ως όρισμα σε μία μέθοδο value types με συνολικό μέγεθος μεγαλύτερο από 256 bytes, εκτός αν το κάνετε by ref (και προσοχή στους code generators).

    Ύστερα απ' όλ' αυτά, αναγκαστικά έφτιαξα μια κλάση για τις ορφανές μεταβλητές και έκανα refactoring στον κώδικα. Πάλι έφαγα exception, αλλά γιατί είχα κάνει μία χαζομάρα κατά το overriding στο ToString() method ενός object. Ευτυχώς πάντως που αντί για κλάσεις δεν είχα φτιάξει "παχιά" structs...

    Κλείνοντας, θα ήθελα να επισημάνω ότι αξίζει να ρίξετε και μια ματιά στο SOS Debugging Extension. Αν κάποιος γνωρίζει κάτι περισσότερο για το θέμα ας κάνει ένα post για να διορθώσω "κακώς κείμενα" που πιθανόν μου διαφεύγουν.


    Ακόμα κι ένας άνθρωπος μπορεί ν' αλλάξει τον κόσμο. Μη θέλεις να κυβερνήσεις. Απλά δείξε το μονοπάτι κι ο κόσμος θ' ακολουθήσει!!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems